package cn.itsource.pethome.user.service.impl;

import cn.itsource.pethome.basic.util.HttpClientUtils;
import cn.itsource.pethome.basic.util.MD5Utils;
import cn.itsource.pethome.basic.util.RedisUtils;
import cn.itsource.pethome.basic.util.StrUtils;
import cn.itsource.pethome.user.constant.PhoneConstant;
import cn.itsource.pethome.user.constant.WechatConstant;
import cn.itsource.pethome.user.domain.User;
import cn.itsource.pethome.user.domain.WeChatUser;
import cn.itsource.pethome.user.domain.dto.WechatUserDto;
import cn.itsource.pethome.user.mapper.UserMapper;
import cn.itsource.pethome.user.mapper.WechatMapper;
import cn.itsource.pethome.user.service.IWechatService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Service
public class WechatServiceImpl implements IWechatService {
    @Autowired
    private WechatMapper wechatMapper;
    @Autowired
    private UserMapper userMapper;

    /**
     * 处理回调相关
     * @param code
     * @return
     */
    @Override
    public Map<String, Object> handleCallBack(String code) {
        String token_url = WechatConstant.TOKEN_URL.replace("APPID", WechatConstant.APPID)
                .replace("SECRET", WechatConstant.SECRET)
                .replace("CODE", code);
        //发送   get请求
        String accessToken = HttpClientUtils.httpGet(token_url);
        //将accessToken字符串转化为json对象，获取access_token 和 openids
        JSONObject TokenObject = JSON.parseObject(accessToken);
        //获取用户信息
        String user_info = WechatConstant.USER_INFO.replace("ACCESS_TOKEN", TokenObject.getString("access_token"))
                .replace("OPENID", TokenObject.getString("openid"));
        if (user_info == null){
            throw new RuntimeException("用户信息不存在");
        }
        //发送   get请求 获取到用户信息json字符串
        String userInfo = HttpClientUtils.httpGet(user_info);
        //将用户信息json字符串转化为json对象
        JSONObject jsonObject = JSON.parseObject(userInfo);
        //根据openid，查询用户信息是否存在,返回微信用户信息
        WeChatUser weChatUser = wechatMapper.loadWechatUser(jsonObject.getString("openid"));
        //创建map对象，用于存放传递到前台的url
        Map<String, Object> map = new HashMap<>();
        //判断微信用户信息是否存在,如果不存在，就进行信息添加
        if (weChatUser == null) {
            WeChatUser user = new WeChatUser();
            //添加用户信息
            user.setOpenid(jsonObject.getString("openid"));
            user.setNickname(jsonObject.getString("nickname"));
            user.setSex(jsonObject.getInteger("sex"));
            //获取地址
            String country = jsonObject.getString("country");
            String province = jsonObject.getString("province");
            String city = jsonObject.getString("city");
            user.setAddress(country+province+city);
            user.setHeadimgurl(jsonObject.getString("headimgurl"));
            user.setUnionid(jsonObject.getString("unionid"));
            //进行注册
            wechatMapper.save(user);
            //返回url,跳转到绑定界面
            map.put("url", WechatConstant.REDIRECT_SERVER + WechatConstant.BINDER+"?openid="+jsonObject.getString("openid"));
            return map;
        }
        //如果这个用户存在了
        //判断该用户是否进行了绑定,获取user对象
        User user = weChatUser.getUser();
        //如果查询到的user用户为空
        if (user == null){
            //返回url,跳转到绑定界面
            map.put("url", WechatConstant.REDIRECT_SERVER + WechatConstant.BINDER+"?openid="+jsonObject.getString("openid"));
            return map;
        }
        //如果用户进行了绑定直接跳转到登录页面
        //通过uuid 获取token
        String token  = UUID.randomUUID().toString();
        //把用户信息存放到redis中
        RedisUtils.INSTANCE.set(token, JSON.toJSONString(user), 60 * 30);
        //将token和loginUser对象传递到前台
        map.put("token",token);
        map.put("loginUser",user);
        return map;
    }

    /**
     * 微信用户绑定
     * @param wechatUserDto 微信用户临时参数
     * @return
     */
    @Override
    public Map<String, Object> wechatUserBinder(WechatUserDto wechatUserDto) {
        //获取到用户输入的用户名
        String username = wechatUserDto.getUsername();
        //根据用户名查询用户是否存在，如果存在则判断用户的密码是否正确
        User user = userMapper.loadUserByPhone(username);
        //创建map集合用于存放token和用户登录信息，返回到前台
        Map<String, Object> map = new HashMap<>();
        //判断用户是否存在
        if (user == null) {
            //创建用户对象
            User u = new User();
            //设置用户名
            u.setUsername(wechatUserDto.getUsername());
            //设置状态为激活
            u.setState(PhoneConstant.ACTIVE);
            //设置盐值为10为数
            u.setSalt(StrUtils.getComplexRandomString(10));
            //设置密码
            u.setPassword(MD5Utils.encrypByMd5(wechatUserDto.getPassword()+u.getSalt()));
            //保存用户信息
            userMapper.addUser(u);
            //将用户信息和微信用户信息进行绑定
            wechatMapper.update(u.getId(),wechatUserDto.getOpenid());
            //用户信息保存成功之后，直接跳转到登录页面
            //将用户信息和token存放到redis中，获取token
            String token = UUID.randomUUID().toString();
            //以token为key存放用户信息
            RedisUtils.INSTANCE.set(token, JSON.toJSONString(u), 60 * 30);
            //传递token和用户信息到前台进行保存
            map.put("token", token);
            map.put("loginUser", u);
            //返回map
            return map;
        }
        //用户名存在，则进行密码判断
        if (!MD5Utils.encrypByMd5(wechatUserDto.getPassword()+user.getSalt()).equals(user.getPassword())){
            throw new RuntimeException("密码不正确");
        }
        //密码和用户名都正确，进行绑定
        wechatMapper.update(user.getId(),wechatUserDto.getOpenid());
        //将用户信息和token存放到redis中，获取token
        String token = UUID.randomUUID().toString();
        //以token为key存放用户信息
        RedisUtils.INSTANCE.set(token, JSON.toJSONString(user), 60 * 30);
        //传递token和用户信息到前台进行保存
        map.put("token", token);
        map.put("loginUser", user);
        //返回map
        return map;
    }
}
